home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
drdobbs
/
1987
/
03
/
shammas.lst
< prev
next >
Wrap
File List
|
1987-02-06
|
19KB
|
602 lines
Listing 1. CHANGE.BAS Utility to search/replace text in a number of files.
1000 ' Batch Find/Replace Utility Version 1.0 10/29/86
1005 ' IBM PC BASICA version 2 or later
1010 ' Copyright (c) 1987 Namir Clement Shammas
1020 DEFINT A-Z
1030 DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
1040 TRUE = 1
1050 FALSE = 0
1060 MAX.LINES = 500 ' Current maximum number of lines read from a file
1900 CLS
1910 T$ = "BATCH FILE FIND/REPLACE PROGRAM" : GOSUB 8000
1920 PRINT
1930 T$ = "VERSION 1.0" : GOSUB 8000
1940 PRINT : PRINT
2000 GOSUB 5000 ' Get filenames
2010 GOSUB 6000 ' Get strings
2030 FOR IFILE = 1 TO NUM.FILES
2060 GOSUB 7000 ' Read text lines from file
2070 FOR I = 1 TO NUM.STRINGS
2080 FOUND = FALSE
2090 FOR J = 1 TO NUM.LINES
2100 PTR = INSTR(L$(J),STRNG$(I))
2110 WHILE PTR > 0
2120 IF (FOUND = TRUE) THEN 2150
2130 FOUND = TRUE
2140 LPRINT "KEYWORD : ";STRNG$(I)
2150 B$ = STR$(J) + ":"
2153 OFFSET = LEN(B$)
2155 LPRINT J;":";L$(J)
2160 LPRINT SPC(PTR+OFFSET);"^"
2170 IF (REPLACE(I) = FALSE) THEN 2240
2180 FIRST$ = ""
2190 IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
2200 LAST$ = ""
2210 IF (PTR+LEN(STRNG$(I))) => LEN(L$(J)) THEN 2230
2220 LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
2230 L$(J) = FIRST$ + REPLACE$(I) + LAST$
2231 LPRINT "BECOMES" : LPRINT
2233 LPRINT J;":";L$(J) : LPRINT : LPRINT
2240 PTR = INSTR(PTR+1,L$(J),STRNG$(I))
2250 WEND
2260 NEXT J
2270 NEXT I
2275 GOSUB 9000 ' Write file back
2277 LPRINT : LPRINT
2280 NEXT IFILE
2290 LPRINT CHR$(140) ' FORM FEED
3000 END '---------------------------------------------------------
5000 ' Subroutine to input filenames from the keyboard
5010 NUM.FILES = 0
5020 WHILE NUM.FILES <= 0
5030 INPUT "Enter number of files ";NUM.FILES
5040 PRINT
5050 WEND
5060 FOR I = 1 TO NUM.FILES
5070 PRINT "Enter filename # ";I;" ";
5080 INPUT FILENAME$(I) : PRINT
5090 IF FILENAME$(I) = "" THEN 5070
5100 NEXT I
5110 RETURN
6000 ' Subroutines to inpur search/replace strings
6010 NUM.STRINGS = 0
6020 WHILE NUM.STRINGS <= 0
6030 INPUT "Enter number of search/replace strings ";NUM.STRINGS
6040 PRINT
6050 WEND
6060 FOR I = 1 TO NUM.STRINGS
6065 REPLACE$(I) = ""
6070 PRINT : PRINT "For string # ";I
6080 INPUT " Enter string ";STRNG$(I)
6090 INPUT " R)eplace F)ind ";A$
6100 IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN REPLACE(I) = FALSE ELSE REPLACE(I) = TRUE
6110 IF REPLACE(I) = FALSE THEN 6125
6120 INPUT " Enter replacement string ";REPLACE$(I)
6125 PRINT
6130 NEXT I
6140 RETURN
7000 ' Subroutines to read text lines
7003 LPRINT "PROCESSING FILE : ";FILENAME$(IFILE)
7006 OPEN "I",1,FILENAME$(IFILE)
7010 NUM.LINES = 0
7020 WHILE (NOT EOF(1)) AND (NUM.LINES <= MAX.LINES)
7030 NUM.LINES = NUM.LINES + 1
7040 LINE INPUT#1,L$(NUM.LINES)
7050 WEND
7060 CLOSE #1
7070 RETURN
8000 ' Subroutine to center a message
8010 PRINT SPC(40 - LEN(T$)/2);T$
8020 RETURN
9000 'Subroutine to write the updated file
9010 OPEN "O",1,FILENAME$(IFILE)
9020 FOR I = 1 TO NUM.LINES
9030 PRINT#1,L$(I)
9040 NEXT I
9050 CLOSE#1
9060 RETURN
Listing 2. CHNG1.TRU the version of True BASIC CHANGE.BAS produced by the
BASIC-Converter.
10 ! This program converted from the Microsoft Advanced Basic
11 ! language on the IBM PC to the True BASIC language.
12 !
13 ! Convertor copyright (c) 1985 by:
14 ! True BASIC, Inc.
15 ! Hanover, NH 03755
16 ! All rights reserved.
17 !
18 ! True BASIC makes no warranty, expressed or implied, that
19 ! this converted program is a precise and accurate equivalent
20 ! of the original BasicA program. This conversion is provided
21 ! only as an aid to a complete conversion by the owner of the
22 ! program being converted.
23 !
24 LIBRARY "deflib"
25 DECLARE DEF csrlin, oef, fre, hex$, inkey$, loc, lof
26 DECLARE DEF mki$, mks$, cvi, cvs, oct$, csr_pos, val_a, err, erl
27
28 DEF Eof (f)
29 IF end #f then LET eof = -1 else LET eof = 0
30 END DEF
31
32 DEF Loc (f)
33 ASK #f: record T_ARG1
34 LET t_arg1 = -int(-(t_arg1-1)/128)
35 IF t_arg1 = 0 then let loc = 1 else let loc = t_arg1
36 END DEF
37
38 DEF Lof (f)
39 ASK #f: filesize T_ARG1
40 LET lof = t_arg1
41 END DEF
42
43 OPTION BASE 0
44
1000 ! Batch Find/Replace Utility Version 1.0 10/29/86
1005 ! IBM PC BASICA version 2 or later
1010 ! Copyright (c) 1987 Namir Clement Shammas
1020 ! defint A-Z
1030 dim filename$(20), strng$(30), replace(30), replace$(30), l$(500)
1040 let true = 1
1050 let false = 0
1060 let max__lines = 500 ! Current maximum number of lines read from a file
1900 clear
1910 let t$ = "BATCH FILE FIND/REPLACE PROGRAM"
1911 gosub 8000
1920 print
1930 let t$ = "VERSION 1.0"
1931 gosub 8000
1940 print
1941 print
1945 OPEN #9 : PRINTER
2000 gosub 5000 ! Get filenames
2010 gosub 6000 ! Get strings
2030 for ifile = 1 to num__files
2060 gosub 7000 ! Read text lines from file
2070 for i = 1 to num__strings
2080 let found = false
2090 for j = 1 to num__lines
2100 let ptr = pos(l$(j),strng$(i))
2110 do while ptr > 0
2120 if (found = true) then goto 2150
2130 let found = true
2140 print #9 : "KEYWORD : ";STRNG$(I)
2150 let b$ = str$(j) & ":"
2153 let offset = round(len(b$))
2155 print #9 : J;":";L$(J)
2160 print #9 : REPEAT$(" ",(PTR+OFFSET+1));"^" ! Manual fix on this line
2170 if (replace(i) = false) then goto 2240
2180 let first$ = ""
2190 if ptr > 1 then let first$ = (l$(j))[1:1+(ptr-1)-1]
2200 let last$ = ""
2210 if (ptr+len(strng$(i))) => len(l$(j)) then goto 2230
2220 let last$ = (l$(j))[(ptr+len(strng$(i))):maxnum]
2230 let l$(j) = first$ & replace$(i) & last$
2231 print #9 : "BECOMES"
2232 print #9 :
2233 print #9 : J;":";L$(J)
2234 print #9 :
2235 print #9 :
2240 let ptr = pos(l$(j),strng$(i),ptr+1)
2250 loop
2260 next j
2270 next i
2275 gosub 9000 ! Write file back
2277 print #9 :
2278 print #9 :
2280 next ifile
2290 print #9 : CHR$(140) ! FORM FEED
3000 stop !---------------------------------------------------------
5000 ! Subroutine to input filenames from the keyboard
5010 let num__files = 0
5020 do while num__files <= 0
5030 input prompt "Enter number of files ": num__files
5040 print
5050 loop
5060 for i = 1 to num__files
5070 print "Enter filename # "; i; " ";
5080 input filename$(i)
5081 print
5090 if filename$(i) = "" then goto 5070
5100 next i
5110 return
6000 ! Subroutines to inpur search/replace strings
6010 let num__strings = 0
6020 do while num__strings <= 0
6030 input prompt "Enter number of search/replace strings ": num__strings
6040 print
6050 loop
6060 for i = 1 to num__strings
6065 let replace$(i) = ""
6070 print
6071 print "For string # "; i
6080 input prompt " Enter string ": strng$(i)
6090 input prompt " R)eplace F)ind ": a$
6100 if (pos("Rr",(a$)[1:1]) = 0) then let replace(i) = false else let replace(i) = true
6110 if replace(i) = false then goto 6125
6120 input prompt " Enter replacement string ": replace$(i)
6125 print
6130 next i
6140 return
7000 ! Subroutines to read text lines
7003 print #9 : "PROCESSING FILE : ";FILENAME$(IFILE)
7006 open #1: name filename$(ifile), access input, create old
7010 let num__lines = 0
7020 do while ((not eof(1) <> 0)) and (num__lines <= max__lines)
7030 let num__lines = num__lines+1
7040 line input #1:l$(num__lines) ! Manual fix here
7050 loop
7060 close #1
7070 return
8000 ! Subruotine to center a message
8010 print tab(csr_pos+40-len(t$)/2); t$
8020 return
9000 !Subroutine to write the updated file
9010 open #1: name filename$(ifile), access output, create old
9015 erase #1 ! this line is added
9020 for i = 1 to num__lines
9030 print #1:l$(i)
9040 next i
9050 close #1
9060 return
9061 end
Listing 3. CHNG2.TRU the True BASIC version of CHANGE.BAS that is
translated manually.
! Batch Find/Replace Utility Version 1.0 10/29/86
! IBM PC True BASIC version 1
! Copyright (c) 1987 Namir Clement Shammas
DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
LET TRUE = 1
LET FALSE = 0
LET MAX_LINES = 500 ! Current maximum number of lines read from a file
CLEAR ! Clear screen
CALL CenterText("BATCH FILE FIND/REPLACE PROGRAM")
PRINT
CALL CenterText("VERSION 1.0")
PRINT
PRINT
OPEN #9 : PRINTER
CALL GetFile(FILENAME$, NUM_FILES) ! Get filenames
CALL GetStrings(STRNG$,REPLACE$,REPLACE,NUM_STRINGS) ! Get strings
FOR IFILE = 1 TO NUM_FILES
CALL ReadLines(L$,FILENAME$,IFILE, NUM_LINES) ! Read text lines from file
FOR I = 1 TO NUM_STRINGS
LET FOUND = FALSE
FOR J = 1 TO NUM_LINES
LET PTR = POS(L$(J),STRNG$(I))
DO WHILE PTR > 0
IF (FOUND = FALSE) THEN
LET FOUND = TRUE
PRINT #9 : "KEYWORD : ";STRNG$(I)
END IF
LET B$ = STR$(J) & ":" ! Use & to concatenate strings
LET OFFSET = LEN(B$)
PRINT #9 : J;":";L$(J)
PRINT #9 : REPEAT$(" ",(PTR+OFFSET+1));"^"
IF (REPLACE(I) = TRUE) THEN
LET FIRST$ = ""
IF PTR > 1 THEN LET FIRST$ = L$(J)[1:(PTR-1)]
LET LAST$ = ""
IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
LET LAST$ = L$(J)[(PTR+LEN(STRNG$(I))):LEN(L$(J))]
END IF
LET L$(J) = FIRST$ & REPLACE$(I) & LAST$
PRINT #9 : "BECOMES"
PRINT #9 :
PRINT #9 : J;":";L$(J)
PRINT #9 :
PRINT #9 :
END IF
LET PTR = POS(L$(J),STRNG$(I),(PTR+1))
LOOP
NEXT J
NEXT I
CALL WriteLines(L$,FILENAME$,REPLACE,IFILE,NUM_LINES)
! Write file back
PRINT #9 :
PRINT #9 :
NEXT IFILE
PRINT #9 : CHR$(140) ! FORM FEED
SUB GetFile(FILENAME$(), NUM_FILES)
! Subroutine to input filenames from the keyboard
LET NUM_FILES = 0
DO WHILE NUM_FILES <= 0
INPUT PROMPT "Enter number of files ":NUM_FILES
PRINT
LOOP
FOR I = 1 TO NUM_FILES
LET FILENAME$(I) = ""
DO WHILE FILENAME$(I) = ""
PRINT "Enter filename # ";I;" ";
INPUT FILENAME$(I)
PRINT
LOOP
NEXT I
END SUB
SUB GetStrings(STRNG$(),REPLACE$(),REPLACE(),NUM_STRINGS)
! Subroutines to inpur search/replace strings
LET NUM_STRINGS = 0
DO WHILE NUM_STRINGS <= 0
INPUT PROMPT "Enter number of search/replace strings ":NUM_STRINGS
PRINT
LOOP
FOR I = 1 TO NUM_STRINGS
LET REPLACE$(I) = ""
PRINT
PRINT "For string # ";I
INPUT PROMPT " Enter string ":STRNG$(I)
INPUT PROMPT " R)eplace F)ind ":A$
IF (POS("Rr",A$[1:1]) = 0) THEN
LET REPLACE(I) = FALSE
ELSE
LET REPLACE(I) = TRUE
INPUT PROMPT " Enter replacement string ":REPLACE$(I)
END IF
PRINT
NEXT I
END SUB
SUB ReadLines(L$(),FILENAME$(),INDEX,NUM_LINES)
! Subroutines to read text lines
PRINT #9 : "PROCESSING FILE : ";FILENAME$(INDEX)
OPEN #1 : NAME FILENAME$(INDEX), ORGANIZATION TEXT, ACCESS INPUT, CREATE OLD
LET NUM_LINES = 0
DO WHILE MORE #1
LET NUM_LINES = NUM_LINES + 1
LINE INPUT#1 : L$(NUM_LINES)
LOOP
CLOSE #1
END SUB
SUB CenterText(T$)
! Subroutine to center a message
PRINT REPEAT$(" ",(40 - LEN(T$)/2));T$
END SUB
SUB WriteLines(L$(),FILENAME$(),INDEX,NUM_LINES)
!Subroutine to write the updated file
OPEN #1 : NAME FILENAME$(INDEX), ORGANIZATION TEXT, ACCESS OUTPUT, CREATE OLD
ERASE #1
FOR I = 1 TO NUM_LINES
PRINT#1 : L$(I)
NEXT I
CLOSE#1
END SUB
END
Listing 4. CHNG1.BAS the first QuickBASIC version of CHANGE.BAS that is
translated manually.
' Batch Find/Replace Utility Version 1.0 10/29/86
' IBM PC QuickBASIC version 2
' Copyright (c) 1987 Namir Clement Shammas
DEFINT A-Z
DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
TRUE = 1
FALSE = 0
MAX.LINES = 500 ' Current maximum number of lines read from a file
CLS
T$ = "BATCH FILE FIND/REPLACE PROGRAM" : GOSUB Center
PRINT
T$ = "VERSION 1.0" : GOSUB Center
PRINT : PRINT
GOSUB GetFile ' Get filenames
GOSUB GetStrings ' Get strings
FOR IFILE = 1 TO NUM.FILES
GOSUB ReadLines ' Read text lines from file
FOR I = 1 TO NUM.STRINGS
FOUND = FALSE
FOR J = 1 TO NUM.LINES
PTR = INSTR(L$(J),STRNG$(I))
WHILE PTR > 0
IF (FOUND = FALSE) THEN
FOUND = TRUE
LPRINT "KEYWORD : ";STRNG$(I)
END IF
B$ = STR$(J) + ":"
OFFSET = LEN(B$)
LPRINT J;":";L$(J)
LPRINT SPC(PTR+OFFSET);"^"
IF (REPLACE(I) = TRUE) THEN
FIRST$ = ""
IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
LAST$ = ""
IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
END IF
L$(J) = FIRST$ + REPLACE$(I) + LAST$
LPRINT "BECOMES" : LPRINT
LPRINT J;":";L$(J) : LPRINT : LPRINT
END IF
PTR = INSTR(PTR+1,L$(J),STRNG$(I))
WEND
NEXT J
NEXT I
GOSUB WriteLines ' Write file back
LPRINT : LPRINT
NEXT IFILE
LPRINT CHR$(140) ' FORM FEED
END '---------------------------------------------------------
GetFile: ' Subroutine to input filenames from the keyboard
NUM.FILES = 0
WHILE NUM.FILES <= 0
INPUT "Enter number of files ";NUM.FILES
PRINT
WEND
FOR I = 1 TO NUM.FILES
FILENAME$(I) = ""
WHILE FILENAME$(I) = ""
PRINT "Enter filename # ";I;" ";
INPUT FILENAME$(I) : PRINT
WEND
NEXT I
RETURN
GetStrings: ' Subroutines to inpur search/replace strings
NUM.STRINGS = 0
WHILE NUM.STRINGS <= 0
INPUT "Enter number of search/replace strings ";NUM.STRINGS
PRINT
WEND
FOR I = 1 TO NUM.STRINGS
REPLACE$(I) = ""
PRINT : PRINT "For string # ";I
INPUT " Enter string ";STRNG$(I)
INPUT " R)eplace F)ind ";A$
IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN REPLACE(I) = FALSE ELSE REPLACE(I) = TRUE
IF REPLACE(I) = TRUE THEN
INPUT " Enter replacement string ";REPLACE$(I)
END IF
PRINT
NEXT I
RETURN
ReadLines: ' Subroutines to read text lines
LPRINT "PROCESSING FILE : ";FILENAME$(IFILE)
OPEN "I",1,FILENAME$(IFILE)
NUM.LINES = 0
WHILE (NOT EOF(1)) AND (NUM.LINES <= MAX.LINES)
NUM.LINES = NUM.LINES + 1
LINE INPUT#1,L$(NUM.LINES)
WEND
CLOSE #1
RETURN
Center: ' Subroutine to center a message
PRINT SPC(40 - LEN(T$)/2);T$
RETURN
WriteLines: 'Subroutine to write the updated file
OPEN "O",1,FILENAME$(IFILE)
FOR I = 1 TO NUM.LINES
PRINT#1,L$(I)
NEXT I
CLOSE#1
RETURN
Listing 5. CHNG2.BAS the second QuickBASIC version of CHANGE.BAS that is
translated manually.
' Batch Find/Replace Utility Version 1.0 10/29/86
' IBM PC QuickBASIC version 2
' Copyright (c) 1987 Namir Clement Shammas
DEFINT A-Z
DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
TRUE = 1
FALSE = 0
MAX.LINES = 500 ' Current maximum number of lines read from a file
CLS
CALL CenterText("BATCH FILE FIND/REPLACE PROGRAM")
PRINT
CALL CenterText("VERSION 1.0")
PRINT : PRINT
CALL GetFile(FILENAME$(), NUM.FILES) ' Get filenames
CALL GetStrings(STRNG$(),REPLACE$(),REPLACE(),NUM.STRINGS) ' Get strings
FOR IFILE = 1 TO NUM.FILES
' Read text lines from file
CALL ReadLines(L$(),FILENAME$(),IFILE, NUM.LINES)
FOR I = 1 TO NUM.STRINGS
FOUND = FALSE
FOR J = 1 TO NUM.LINES
PTR = INSTR(L$(J),STRNG$(I))
WHILE PTR > 0
IF (FOUND = FALSE) THEN
FOUND = TRUE
LPRINT "KEYWORD : ";STRNG$(I)
END IF
B$ = STR$(J) + ":"
OFFSET = LEN(B$)
LPRINT J;":";L$(J)
LPRINT SPC(PTR+OFFSET);"^"
IF (REPLACE(I) = TRUE) THEN
FIRST$ = ""
IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
LAST$ = ""
IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
END IF
L$(J) = FIRST$ + REPLACE$(I) + LAST$
LPRINT "BECOMES" : LPRINT
LPRINT J;":";L$(J) : LPRINT : LPRINT
END IF
PTR = INSTR(PTR+1,L$(J),STRNG$(I))
WEND
NEXT J
NEXT I
' Write file back
CALL WriteLines(L$(),FILENAME$(),REPLACE(),IFILE,NUM.LINES)
LPRINT : LPRINT
NEXT IFILE
LPRINT CHR$(140) ' FORM FEED
END '---------------------------------------------------------
SUB GetFile(FILENAME$(1), NUM.FILES) STATIC
' Subroutine to input filenames from the keyboard
NUM.FILES = 0
WHILE NUM.FILES <= 0
INPUT "Enter number of files ";NUM.FILES
PRINT
WEND
FOR I = 1 TO NUM.FILES
FILENAME$(I) = ""
WHILE FILENAME$(I) = ""
PRINT "Enter filename # ";I;" ";
INPUT FILENAME$(I) : PRINT
WEND
NEXT I
END SUB
SUB GetStrings(STRNG$(1),REPLACE$(1),REPLACE(1),NUM.STRINGS) STATIC
' Subroutines to inpur search/replace strings
NUM.STRINGS = 0
WHILE NUM.STRINGS <= 0
INPUT "Enter number of search/replace strings ";NUM.STRINGS
PRINT
WEND
FOR I = 1 TO NUM.STRINGS
REPLACE$(I) = ""
PRINT : PRINT "For string # ";I
INPUT " Enter string ";STRNG$(I)
INPUT " R)eplace F)ind ";A$
IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN
REPLACE(I) = FALSE
ELSE
REPLACE(I) = TRUE
INPUT " Enter replacement string ";REPLACE$(I)
END IF
PRINT
NEXT I
END SUB
SUB ReadLines(L$(1),FILENAME$(1),INDEX,NUM.LINES) STATIC
' Subroutines to read text lines
LPRINT "PROCESSING FILE : ";FILENAME$(INDEX)
OPEN "I",1,FILENAME$(INDEX)
NUM.LINES = 0
WHILE (NOT EOF(1)) ' AND (NUM.LINES <= MAX.LINES)
NUM.LINES = NUM.LINES + 1
LINE INPUT#1,L$(NUM.LINES)
WEND
CLOSE #1
END SUB
SUB CenterText(T$) STATIC
' Subroutine to center a message
PRINT SPC(40 - LEN(T$)/2);T$
END SUB
SUB WriteLines(L$(1),FILENAME$(1),INDEX,NUM.LINES) STATIC
' Subroutine to write the updated file
OPEN "O",1,FILENAME$(INDEX)
FOR I = 1 TO NUM.LINES
PRINT#1,L$(I)
NEXT I
CLOSE#1
END SUB